// package com.zzht.patrol.bp.calculate.utils;
//
// import cn.hutool.core.util.NumberUtil;
// import com.zzht.patrol.bp.calculate.model.task.PatrolTaskSubLine;
// import com.zzht.patrol.database.geometry.Point;
// import com.zzht.patrol.database.geometry.Polyline;
// import org.apache.commons.lang.StringUtils;
//
// import java.util.ArrayList;
// import java.util.HashMap;
// import java.util.List;
//
// /**
//  * @author xiongweitao
//  * @version V1.0 Created on 2022/1/24
//  * @title Line2Pipe
//  * @Description:
//  */
// public class Line2Pipe {
//
//     private static final String PIPE_LINE = "pipeLine";
//     private static final String PIPE_IDS = "pipeIds";
//     /**
//      * 存储管线
//      */
//     private List<HashMap<String, Object>> list = new ArrayList<>();
//
//     public List<HashMap<String, Object>> getList() {
//         return list;
//     }
//
//     public List<LIN_DATA> cacheLinData(List<PatrolTaskSubLine> list) {
//         List<LIN_DATA> datas = new ArrayList<>();
//         for (PatrolTaskSubLine subLine : list) {
//             Polyline polyline = subLine.getGeom();
//             List<Point> points = polyline.getPoints();
//
//             LIN_DATA data = new LIN_DATA();
//             data.setPoints(points);
//             data.setGid(subLine.getSubLineId());
//             data.setStPoint(points.get(0));
//             data.setEdPoint(points.get(points.size() - 1));
//             data.setStnod(subLine.getStartX() + "_" + subLine.getStartY());
//             data.setEdnod(subLine.getEndX() + "_" + subLine.getEndY());
//             datas.add(data);
//         }
//         return datas;
//     }
//
//     public List<List<LIN_DATA>> createPipeByLine(List<LIN_DATA> datas) {
//         HashMap<String, List<LIN_DATA>> nodMaps = new HashMap<>(128);
//
//         for (int i = 0; i < datas.size(); i++) {
//             LIN_DATA data = datas.get(i);
//             List<LIN_DATA> datas1 = null;
//             if (nodMaps.containsKey(data.getStnod())) {
//                 datas1 = nodMaps.get(data.getStnod());
//             } else {
//                 datas1 = new ArrayList<>();
//                 nodMaps.put(data.getStnod(), datas1);
//             }
//             datas1.add(data);
//
//             if (nodMaps.containsKey(data.getEdnod())) {
//                 datas1 = nodMaps.get(data.getEdnod());
//             } else {
//                 datas1 = new ArrayList<>();
//                 nodMaps.put(data.getEdnod(), datas1);
//             }
//             datas1.add(data);
//         }
//
//         HashMap<Long, LIN_DATA> hasDealHashMap = new HashMap<>(128);
//         List<List<LIN_DATA>> pipeDatas = new ArrayList<>();
//         //构造管线,
//         for (int i = 0; i < datas.size(); i++) {
//             LIN_DATA data = datas.get(i);
//             if (hasDealHashMap.containsKey(data.getGid())) {
//                 continue;
//             }
//
//             List<LIN_DATA> pipe = new ArrayList<>();
//             pipe.add(data);
//             hasDealHashMap.put(data.getGid(), data);
//             //st
//             getPipeData(nodMaps, hasDealHashMap, pipe, 1);
//             //ed
//             getPipeData(nodMaps, hasDealHashMap, pipe, 2);
//             pipeDatas.add(pipe);
//         }
//
//         return pipeDatas;
//     }
//
//     private void getPipeData(HashMap<String, List<LIN_DATA>> nodMaps,
//                              HashMap<Long, LIN_DATA> hasDealHashMap,
//                              List<LIN_DATA> pipe, int dir) {
//         LIN_DATA data = null;
//         String nodNo = "";
//         if (dir == 1) {
//             data = pipe.get(0);//st
//             nodNo = data.getStnod();
//         } else {
//             data = pipe.get(pipe.size() - 1);//ed
//             nodNo = data.getEdnod();
//         }
//         if (StringUtils.isEmpty(nodNo)) {
//             return;
//         }
//         LIN_DATA newData = null;
//         if (nodMaps.containsKey(nodNo)) {
//             List<LIN_DATA> datas = nodMaps.get(nodNo);
//
//             for (int i = 0; i < datas.size(); i++) {
//                 long gid = datas.get(i).getGid();
//                 if (!hasDealHashMap.containsKey(gid)) {
//                     newData = datas.get(i);
//
//                     if (dir == 1) {
//                         //看看开始和结束是否调整位置
//                         if (data.getStnod().equals(newData.getStnod())) {
//                             String tempNod = newData.getStnod();
//                             Point tempPoint = newData.getStPoint();
//                             newData.setStnod(newData.getEdnod());
//                             newData.setStPoint(newData.getEdPoint());
//                             newData.setEdnod(tempNod);
//                             newData.setEdPoint(tempPoint);
//                             List<Point> tPoints = new ArrayList<>();
//                             for (int k = newData.getPoints().size() - 1; k > -1; k--) {
//                                 tPoints.add(newData.getPoints().get(k));
//                             }
//                             newData.setPoints(tPoints);
//                         }
//                         pipe.add(0, newData);//插入在最前面
//                     } else {
//                         //看看开始和结束是否调整位置
//                         if (data.getEdnod().equals(newData.getEdnod())) {
//                             String tempNod = newData.getStnod();
//                             Point tempPoint = newData.getStPoint();
//                             newData.setStnod(newData.getEdnod());
//                             newData.setStPoint(newData.getEdPoint());
//                             newData.setEdnod(tempNod);
//                             newData.setEdPoint(tempPoint);
//                             List<Point> tPoints = new ArrayList<>();
//                             for (int k = newData.getPoints().size() - 1; k > -1; k--) {
//                                 tPoints.add(newData.getPoints().get(k));
//                             }
//                             newData.setPoints(tPoints);
//                         }
//                         pipe.add(newData);//插入在后面
//                     }
//                     hasDealHashMap.put(newData.getGid(), newData);
//                     break;
//                 }
//             }
//         }
//         //递归处理
//         if (newData != null) {
//             getPipeData(nodMaps, hasDealHashMap, pipe, dir);
//         }
//     }
//
//
//     /**
//      * 结构体转换为管线
//      */
//     public void pipes2polyline(List<List<LIN_DATA>> pipes) {
//         for (int i = 0; i < pipes.size(); i++) {
//             List<LIN_DATA> pipe = pipes.get(i);
//             try {
//                 List<Point> points = new ArrayList<>();
//                 List<Long> subLineIds = new ArrayList<>();
//                 for (int j = 0; j < pipe.size(); j++) {
//                     LIN_DATA data = pipe.get(j);
//                     subLineIds.add(data.getGid());
//                     if (points.isEmpty()) {
//                         points.add(data.getStPoint());
//                         for (int m = 1; m < data.getPoints().size(); m++) {
//                             points.add(data.getPoints().get(m));
//                         }
//                     } else {
//                         //{{20180721 和上一根线加在一起小于200才合并
//                         Point lastPoint = points.get(points.size() - 2);
//                         for (int m = 1; m < data.getPoints().size(); m++) {
//                             boolean bK = bEqualK(lastPoint, data.getPoints().get(m - 1), data.getPoints().get(m - 1), data.getPoints().get(m));
//                             if (bK) {
//                                 points.remove(points.size() - 1);
//                             }
//                             points.add(data.getPoints().get(m));
//                             lastPoint = points.get(points.size() - 2);
//                         }
//                     }
//                 }
//                 pipeSave(points, subLineIds);
//             } catch (Exception e) {
//             }
//         }
//     }
//
//     private void pipeSave(List<Point> points, List<Long> subLineIds) {
//         HashMap<String, Object> hashMap = new HashMap<>();
//         hashMap.put(PIPE_LINE, points);
//         hashMap.put(PIPE_IDS, subLineIds);
//         list.add(hashMap);
//     }
//
//     /**
//      * 判断两个线段的斜率是否相等
//      * <p>
//      * 仅判断斜率相等是不够的,还要区分两条线是正向还是反向
//      */
//     private boolean bEqualK(Point stPoint1, Point edPoint1, Point stPoint2, Point edPoint2) {
//         boolean bRet = false;
//         //上一段线的斜率
//         double dx1 = edPoint1.getX() - stPoint1.getX();
//         double dy1 = edPoint1.getY() - stPoint1.getY();
//
//         double k1 = -1;
//         if (!NumberUtil.equals(dx1, 0)) {
//             k1 = dy1 / dx1;
//         }
//         //下一段线的斜率
//         double dx2 = edPoint2.getX() - stPoint2.getX();
//         double dy2 = edPoint2.getY() - stPoint2.getY();
//
//         double k2 = -1;
//         if (!NumberUtil.equals(dx2, 0)) {
//             k2 = dy2 / dx2;
//         }
//         double key = Math.abs(k1 - k2);
//         if (NumberUtil.equals(k1, -1) && key < 0.001) {
//             if (edPoint1.getY() - stPoint1.getY() > 0) {
//                 if (edPoint2.getY() > edPoint1.getY()) {
//                     //延伸
//                     bRet = true;
//                 } else {
//                     //反向
//                 }
//             } else {
//                 if (edPoint2.getY() > edPoint1.getY()) {
//                     //反向
//                 } else {
//                     //延伸
//                     bRet = true;
//                 }
//             }
//             return bRet;
//         }
//         if (key < 0.001) {
//             if (k1 >= 0) {
//                 if (edPoint1.getX() - stPoint1.getX() > 0) {
//                     if (edPoint2.getX() > edPoint1.getX()) {
//                         //延伸
//                         bRet = true;
//                     } else {
//                         //反向
//                     }
//                 } else {
//                     if (edPoint2.getX() > edPoint1.getX()) {
//                         //反向
//                     } else {
//                         //延伸
//                         bRet = true;
//                     }
//                 }
//             } else {
//                 if (edPoint1.getX() - stPoint1.getX() > 0) {
//                     if (edPoint2.getX() > edPoint1.getX()) {
//                         //延伸
//                         if (key < 0.001) {
//                             bRet = true;
//                         }
//                     } else {
//                         //反向
//                     }
//                 } else {
//                     if (edPoint2.getX() > edPoint1.getX()) {
//                         //反向
//                     } else {
//                         //延伸
//                         if (key < 0.001) {
//                             bRet = true;
//                         }
//                     }
//                 }
//             }
//         }
//
//         return bRet;
//     }
// }
